# -*- coding: utf-8 -*-
'''
@author: José Ribeiro
'''

#import Graficos
import csv
import os
import pickle
import sqlite3
import wx

#class Estatistica
#responsavel por todas as estatisticas a Base dados
class Estatistica :
    def __init__(self, nome_BD, ano):
        self.nome_BD = nome_BD
        self.ano = ano
        #self.criar_tabelas(nome_BD)
        pass

    #metodo que irá obter uma lista de categorias por ano, que irá ser 
    #usado no método seguinte
    
    
    def listaCateEstabAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        listaCate =[]
        cmd = """SELECT DISTINCT (categoria), ano \
                FROM registo_docentes
                WHERE ano = '{0}'""".format(ano)
        cursor.execute(cmd)
        
        for lista in cursor:
            listaCate.append(lista)
            pass
        return listaCate
        pass
        
        
        #Método que irá mostrar o numero total de alunos, por categorias num dado ano
        #este metodo recebe como parametros o nome da 
        #base dados em questão e o ano a que se referem os dados
        
        
    def totalDocentesCateEstabPorAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        lista = []
        listaCateEstab = self.listaCateEstabAno(nome_BD, ano)
        for nome_T_Est, anoR in listaCateEstab:
            cmd = """SELECT DISTINCT docente, categoria
                    FROM registo_docentes
                    WHERE ((categoria) Like '{0}') and ano = {1}""".\
                    format(nome_T_Est.encode('utf-8'), ano)
            
            cursor.execute(cmd)
            numeroDocentes = 0
            verificarDocente = 0
            for linha in cursor:
                if linha[0] != verificarDocente:
                    numeroDocentes = numeroDocentes + 1
                    verificarDocente = linha[0]
                    pass
                pass
            conteudoLista = [nome_T_Est.encode('utf-8'), numeroDocentes, ano]
            lista.append(conteudoLista)
            pass
        return lista
        pass


    #Metodo que devole uma lista com todos estabelecimentos
    #num dado ano, este metodo recebe como parametros o nome da 
    #base dados em questão e o ano a que se referem os dados
    
    def listaEstabPorAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        cmd ='''SELECT DISTINCT (docente), ano, estabelecimento
                FROM registo_docentes
               WHERE ano = '{0}' '''.format(ano)
            
        cursor.execute(cmd)
        lista1 =[]
        for row in cursor:
            docentes = row[0]
            ano = row[1]
            nomeEstab = row[2]
            lista = [docentes.encode('utf-8'), '200{0}'.format(ano), nomeEstab.encode('utf-8')]
            lista1.append(lista)
            pass
        return lista1
        pass
    
    #metodo que vai dar a estatistica com o numero total de 
    #docentes por estabelecimento, recebe como parametro
    #o nome da base dados e o ano
    #e devolve uma lista com numero de docentes, o ano
    #e o nome do estabelecimento
    def totalDocentesEstabPorAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        lista = []        
        listaEstabAno = self.listaEstAno(nome_BD, ano)
        for nome_Est, anoR in listaEstabAno:
            
            cmd = """SELECT DISTINCT docente, estabelecimento
                    FROM registo_docentes
                    WHERE ((estabelecimento) Like '{0}') and ano = {1}""".\
                    format(nome_Est.encode('utf-8'), ano)
            cursor.execute(cmd)
            numeroDocentes = 0
            verificarDocente = 0
            for linha in cursor:
                if linha[0] != verificarDocente:
                    numeroDocentes = numeroDocentes + 1
                    verificarDocente = linha[0]
                    pass
                pass
            conteudoLista = [numeroDocentes, ano, nome_Est.encode('utf-8')]
            lista.append(conteudoLista)
            pass
        return lista
        pass
    

    
    #metodo que devolve uma lista com os estabelecimentos num dado ano
    #devolve o nome de estabelecimento e o ano
    #recebe como parametro o nome da base dados e
    #o ano a que se rerfer
    def listaEstAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        listaEstab =[]
        cmd = """SELECT DISTINCT (estabelecimento), ano \
                FROM registo_docentes
                WHERE ano = '{0}'""".format(ano)
        cursor.execute(cmd)
        
        for lista in cursor:
            listaEstab.append(lista)
            pass
        return listaEstab
        pass
    
    #Metodo que vai dar a estatistica numero total de docentes
    #por grau e por estabelecimento, recebe como parametro
    #o nome da Base dados e o ano
    #devolve uma lista que vai conter o numero de docentes
    #o ano o estabelecimento e o grau
    #Importa ainda referir que este metodo, tem como graus,
    #licenciados, mestres e doutores
    def nrDocentGrauEstab(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor() 
        listaGraus = ["%licenci%","%mestre%","do%"]
        lista =[]
        listaEstabAno = self.listaEstAno(nome_BD, ano)
        for grau in listaGraus:    
            for nomeEstab, ano in listaEstabAno:
                cmd ="""SELECT DISTINCT (docente), ano, grau, estabelecimento \
                        FROM registo_docentes \
                        WHERE grau LIKE '{0}' AND \
                        estabelecimento LIKE '{1}' AND 
                        ano = '{2}'""".format(grau, nomeEstab.encode('utf-8'), ano)
                cursor.execute(cmd)
                numeroDocentes = 0
                verificarDocente = 0
                for linha in cursor:
                    if linha[0] != verificarDocente:
                        numeroDocentes = numeroDocentes + 1
                        grauTabela = linha[2]
                        verificarDocente = linha[0]
                        pass
                    pass
                conteudoLista = [numeroDocentes, ano, nomeEstab.encode('utf-8'), grauTabela]
                lista.append(conteudoLista)
                pass
            pass
        return lista
        pass
    
    #Metodo que devole uma lista com todos os docentes por estabelecimento
    #num dado ano, este metodo recebe como parametros o nome da 
    #base dados em questão e o ano a que se referem os dados
    
    def listaDocentesEstabPorAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        cmd ='''SELECT DISTINCT (docente), ano, estabelecimento
                FROM registo_docentes
               WHERE ano = '{0}' '''.format(ano)
            
        cursor.execute(cmd)
        lista1 =[]
        for row in cursor:
            docentes = row[0]
            ano = row[1]
            nomeEstab = row[2]
            lista = [docentes.encode('utf-8'), '200{0}'.format(ano), nomeEstab.encode('utf-8')]
            lista1.append(lista)
            pass
        return lista1
        pass
    
    #Metodo que devolve uma lista com os docentes por estabelecimentos
    #e categoria num dado ano, vai receber o nome da 
    #Base dados e o ano a que se vao referir os dados
    #a lista devolte o nome do tipo Estabelecimento
    #o ano, e o estabelecimento
    def listaDocenteCateEstab_PorAno(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor()
        cmd ='''SELECT DISTINCT (docente), ano, estabelecimento, categoria
                FROM registo_docentes
               WHERE ano = '{0}' '''.format(ano)
            
        cursor.execute(cmd)
        lista1 =[]
        for row in cursor:
            docentes = row[0]
            ano = row[1]
            nomeEstab = row[2]
            categoria = row[3]
            lista = [docentes.encode('utf-8'), '200{0}'.format(ano), nomeEstab.encode('utf-8'), categoria.encode('utf-8')]
            lista1.append(lista)
            pass
        return lista1
        pass
    
    #Metodo que devolve uma lista dos titulares de cada grau
    #importa referir que os graus que estao a ser utilizado são os 
    #seguintes Licenciados, Mestres e Doutores.
    #o metodo recebe como parametro o nome da Base Dados e o ano
    #e devolve uma lista com o nome do docente, o grau correspondente e o 
    #ano a que se refere
    def listaTitularesGrau(self, nome_BD, ano):
        conn = sqlite3.connect(nome_BD)
        cursor = conn.cursor() 
        listaGraus = ["%licenci%","%mestre%","do%"]
        listaDados =[]
        for grau in listaGraus: 
            cmd = """SELECT DISTINCT (docente), grau, ano
                    FROM registo_docentes
                    WHERE grau LIKE '{0}'
                    AND ano = '{1}'""".format(grau, ano)
            cursor.execute(cmd)
            
            for row in cursor:
                docente = row[0]
                grau = row[1]
                ano = row[2]
                estabelecimento = row[3]
                lista = [docente.encode('utf-8'), grau.encode('utf-8'), ano, estabelecimento.encode('utf-8')]
                listaDados.append(lista)
                pass
            pass
        return listaDados       
        pass
    
            
    
    #Metodo que vai ser chamado no evento que mostra a 
    #estatistica do numero total de docentes por 
    #categoria e estabelecimento, é responsavel 
    #por mostrar ao utilizador essa mesma estatistica, vai criar o 
    #ficheiro csv com a mesma estatistica, cria um ficheiro HTML
    #com a estatistica e vai fazer o system do modulo
    #GraficoDocenCateEstab.py que faz com que o gere o grafico
    #este metodo recebe como parametro o nome da Base dados, e o ano a 
    #se refere a estatistica, vai devolver a mensagem que é mostrada ao 
    #utilizador na interface...
    def dados_evento_nrDocentCateEstab(self, nome_BD, ano):
        dadosDocentes = self.totalDocentesCateEstabPorAno(nome_BD, ano)
        
        mensagem = "Docentes por categoria e por Estabelecimento no ano de 200{0}: \n\n".\
                            format(ano)
        mensagemHTML = "Docentes por categoria e por Estabelecimento no ano de 200{0}: <br><br>".\
                            format(ano)
        nrDocentes = []                 
        for posicao in dadosDocentes:
            mensagem = mensagem + str(posicao[0]) + " = " + str(posicao[1]) + " Docentes " + "\n"
            mensagemHTML = mensagemHTML + str(posicao[0]) + " = " + str(posicao[1]) + " Docentes " + "<br>"
            nrDocentes.append(str(posicao[1]))
            pass
        mensagem = mensagem + "\n\nfoi guardado um ficheiro csv com a estatistica \
tem o nome nrDocenCateEstab{0}.csv na pasta csv\n".format(ano)
        mensagem = mensagem + "Na raiz do programa foi guardado um gráfico com o nome NumeroDocTipoEstab200{0}.png".format(ano)
            
        
        self.escrever_Em_csv('nrDocenCateEstab{0}.csv'.format(ano), dadosDocentes)
        self.escrever_Em_HTML('NrDocenCateEsta200{0}.html'.format(ano), mensagemHTML)
        
        
        return mensagem
        pass
    
    #Metodo que vai ser chamado no evento que mostra a 
    #estatistica do numero total de docentes por 
    #estabelecimento, é responsavel por mostrar ao utilizador
    #essa mesma estatistica, vai criar o ficheiro csv com a mesma estatistica, 
    #cria um ficheiro HTML com a estatistica
    #este metodo recebe como parametro o nome da Base dados, e o ano a 
    #se refere a estatistica, vai devolver a mensagem que é mostrada ao 
    #utilizador na interface...
    def dados_evento_nrDocentEstab(self, nome_BD, ano):
        dadosDocentes = self.totalDocentesEstabPorAno(nome_BD, ano)
        mensagem = "Docentes por Estabelecimento no ano de 200{0}: \n\n".\
                    format(ano)
        mensagemHTML = "Docentes por Estabelecimento no ano de 200{0}: <br><br>".\
                    format(ano)
        
        for posicao in dadosDocentes:
            mensagem = mensagem + str(posicao[2]) + " = " + str(posicao[0]) + " Docentes " + "\n"
            mensagemHTML = mensagemHTML + str(posicao[2]) + " = " + str(posicao[0]) + " Docentes " + "<br>"
            pass
        
        self.escrever_Em_csv('nrDocenEstab{0}.csv'.format(ano), dadosDocentes)
        self.escrever_Em_HTML('NrDocenEsta200{0}.html'.format(ano), mensagemHTML)
        mensagem = mensagem + "\n\nfoi guardado um ficheiro csv com a estatistica \
tem o nome nrDocenEstab{0}.csv na pasta csv\n".format(ano)
        
        return mensagem
        pass
    
    
    
    #Metodo que vai ser chamado no evento que mostra a 
    #estatistica do numero total de docentes por grau e por
    #estabelecimento, é responsavel por mostrar ao utilizador
    #essa mesma estatistica, vai criar o ficheiro csv com a mesma estatistica, 
    #cria um ficheiro HTML com a estatistica
    #este metodo recebe como parametro o nome da Base dados, e o ano a 
    #se refere a estatistica, vai devolver a mensagem que é mostrada ao 
    #utilizador na interface...
    def dados_evento_DocentGrauEstab(self, nome_BD, ano):
        dados = self.nrDocentGrauEstab(nome_BD, ano)
        mensagem = "Número total de Docentes por grau e por Estabelecimento no ano de 200{0}: \n\n".\
                    format(ano)
        mensagemHTML = "Número total de Docentes por grau e por Estabelecimento no ano de 200{0}: <br><br>".\
                    format(ano)
        for dadosDocentes in dados:
            mensagem = mensagem + "O número de docentes no Estabelecimento, " + str(dadosDocentes[2]) \
                + " com o grau, " + str(dadosDocentes[3]) \
                + " é igual a " + str(dadosDocentes[0]) + "\n"
            mensagemHTML = mensagemHTML + "O número de docentes no Estabelecimento, " + str(dadosDocentes[2]) \
                + " com o grau, " + str(dadosDocentes[3]) \
                + " é igual a " + str(dadosDocentes[0]) + "<br>"
            pass
        self.escrever_Em_csv('DocentPorGrauPorEstab200{0}.csv'.format(ano), dados)
        self.escrever_Em_HTML('NrDocenGrauEst200{0}.html'.format(ano), mensagemHTML)
        mensagem = mensagem + "\n\nfoi guardado um ficheiro csv com a estatistica \
tem o nome DocentPorGrauPorEstab200{0}.csv na pasta csv!!\n".format(ano)
        return mensagem
        pass
    
    #Metodo que vai ser chamado no evento que mostra  
    #a lista com todos os Docentes por estabelecimento existentes num dado ano
    #é responsavel por mostrar ao utilizador
    #essa mesma lista, vai criar o ficheiro csv e um ficheiro HTML com a lista
    #este metodo recebe como parametro o nome da Base dados, e o ano a 
    #se refere a lista, vai devolver a mensagem que é mostrada ao 
    #utilizador na interface...
    def dados_listaEstabPorAno(self, nome_BD, ano): 
        lista = self.listaDocenteCateEstab_PorAno(nome_BD, ano)
        mensagem = "Lista de Docentes por estabelecimento no Ano 200{0}: \n\n".\
                    format(ano)
        mensagemHTML = "Lista de Docentes por estabelecimento no Ano 200{0}: <br><br>".\
                    format(ano)
        for dadoslista in lista:
            
            mensagemHTML = mensagemHTML + str(dadoslista[0]) + " do Estabelecimento: " + str(dadoslista[2]) + "<br>"
            pass         
        self.escrever_Em_csv('LisEstabAno200{0}.csv'.format(ano), lista)
        self.escrever_Em_HTML('ListaEstab200{0}.html'.format(ano), mensagemHTML)
        mensagem = mensagem + "\n\nfoi guardado um ficheiro csv com a lista \
tem o nome LisEstabAno200{0}.csv na pasta csv!!\n".format(ano)
        mensagem = mensagem + "\n\nfoi guardado um ficheiro html com a lista \
tem o nome LisEstabAno200{0}.html na pasta html!!\n".format(ano)
        return mensagem
        pass
    
    #Metodo que vai ser chamado no evento que mostra  
    #a lista com todos os Docentes por categoria e estabelecimentos
    #que existem num dado ano, é responsavel por mostrar ao utilizador
    #essa mesma lista, vai criar o ficheiro csv e um ficheiro HTML com a lista
    #este metodo recebe como parametro o nome da Base dados, e o ano a 
    #se refere a lista, vai devolver a mensagem que é mostrada ao 
    #utilizador na interface...
    def dados_listaCateEstab_PorAno(self, nome_BD, ano):
        lista = self.listaDocenteCateEstab_PorAno(nome_BD, ano)
        mensagem = "Lista de docentes, por categoria, estabelecimento,  no ano 200{0}: \n\n".\
                    format(ano)
        mensagemHTML = "Lista de docentes, por categoria, estabelecimento, no ano 200{0}: <br><br>".\
                    format(ano)
        for dadoslista in lista:
            
            mensagemHTML = mensagemHTML + str(dadoslista[0])\
                        + " com a categoria " + str(dadoslista[3]) + " leciona no estabelecimento " + str(dadoslista[2]) + "<br>"
            pass
        self.escrever_Em_csv('ListaCateEstab200{0}.csv'.format(ano), lista)
        self.escrever_Em_HTML('ListaCateEstab200{0}.html'.format(ano), mensagemHTML)
        mensagem = mensagem + "\n\nfoi guardado um ficheiro csv com a lista \
tem o nome LisInstitu_EstabAno200{0}.csv na pasta csv!!\n".format(ano)
        mensagem = mensagem + "\n\nfoi guardado um ficheiro html com a lista, \
com o nome LisInstitu_EstabAno200{0}.csv na pasta html!!\n".format(ano)
        return mensagem
        pass
    
    
    #Metodo que vai ser chamado no evento que mostra  
    #a lista dos docentes e a que grau correspndem
    #que existem num dado ano, é responsavel por mostrar ao utilizador
    #essa mesma lista, vai criar o ficheiro csv e um ficheiro HTML com a lista
    #este metodo recebe como parametro o nome da Base dados, e o ano a 
    #se refere a lista, vai devolver a mensagem que é mostrada ao 
    #utilizador na interface...
    def dados_listaTitularesGrauEstab(self, nome_BD, ano):
        lista = self.listaTitularesGrau(nome_BD, ano)
        mensagem = "Lista dos titulares de um grau por estabelecimento, no Ano 200{0}: \n\n".\
                    format(ano)
        mensagemHTML = "Lista dos titulares de um grau por estabelecimento, no Ano 200{0}: <br><br>".\
                    format(ano)
        for dadoslista in lista:
            
            mensagemHTML = mensagemHTML + "O docente " + str(dadoslista[0]) \
                          + " contêm o grau " + str(dadoslista[1]) + " leciona no estabelecimento" + str(dadoslista[3]) + "\n"
            pass
        return mensagem
        self.escrever_Em_csv('LisTitulaGraus200{0}.csv'.format(ano), lista)
        self.escrever_Em_HTML('ListaTitulGrau200{0}.html'.format(ano), mensagemHTML)
        mensagem = mensagem + "\n\n Foi guardado um ficheiro csv com a lista \
tem o nome LisTitulaGraus200{0}.csv na pasta csv!!\n".format(ano)
        mensagem = mensagem + "\n\n Foi guardado um ficheiro html com a lista, \
com o nome LisTitulaGraus200{0}.html na pasta html!!\n".format(ano)
        pass
    
    """
    Fim dos metodos dos eventos..
    """

    #metodo para escrever as estatisticas num ficheio csv
    #recebe o nome do ficheiro onde guardar os dados
    #e uma lista com o conteudo a escrever
    def escrever_Em_csv(self, nomeFile, listaEscrever):
        '''
        escrita dos dados em ficheiro csv
        '''
        ficheiro = open("csv/" + nomeFile,"wb")
        csvwriter = csv.writer( ficheiro, delimiter=',')
        
        for escreve in listaEscrever:
            csvwriter.writerow(escreve)
            pass
        ficheiro.close()
        pass
    
    #Metodo para escrever as estatisticas num ficheiro html
    #Recebe como parametro o nome do ficheiro e uma mensagem
    #com o a estatistica que deve ser apresentada ao utilizador 
    def escrever_Em_HTML(self, nomePagina, msg):
        pagina = open("html/" + nomePagina,"wb")
        pagina.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">')
        pagina.write("<html>")
        pagina.write("<head>")
        pagina.write("<title>Estatisticas Rebides - Trabalho LP 2011</title>")
        pagina.write("</head>")
        pagina.write("<body>")
        pagina.write("<h4>" + msg +"</h4>")
        pagina.write("</body>")
        pagina.write("</html>")
        pagina.close()
        pass
    
    #metodo para criar uma pagina inicial com todas as 
    #Estatisticas para cada ano
    #recebe como parametro o nome pagina
    def criarFileHTML_index(self, nomePagina):
        pagina = open(nomePagina,"wb")
        pagina.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">')
        pagina.write("<html>")
        pagina.write("<head>")
        pagina.write('<title>Estatisticas Rebides - Trabalho LP 2011</title>\
                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">')
        pagina.write("</head>")
        pagina.write("<body>")
        pagina.write("<h1>Lista de todas as estatisticas</h1><br>")
        for ano in range (0, 10):
            pagina.write("<h3>Ano 200{0}</h3>".format(ano))
            pagina.write('<li><a href="html/NrDocenCateEsta200{0}.html">Numero Total de docentes por instituicao</a></li>'.format(ano))
            pagina.write('<li><a href="html/NrDocenEsta200{0}.html">Numero Total de docentes por Estabelecimento</a></li>'.format(ano))
            pagina.write('<li><a href="html/NrDocenGrauEst200{0}.html">Numero Total de docentes por Grau e por Estabelecimento</a></li>'.format(ano))
            pagina.write('<li><a href="html/ListaEstab200{0}.html">Lista de Intituicoes</a></li>'.format(ano))
            pagina.write('<li><a href="html/ListaCateEstab200{0}.html.html">Lista de Intituicoes e Estabelecimentos</a></li>'.format(ano))
            pagina.write('<li><a href="html/ListaTitulGrau200{0}.html">Lista Titulares dos Graus</a></li></ul>'.format(ano))
            pass
        pagina.write("</body>")
        pagina.write("</html>")
        pagina.close()
        pass
